1.flask-sqlalchemy 的介绍

  • flask-sqlalchemy 简化了 sqlalchemy 在 Flask 中的操作

2.flask-sqlalchemy 的安装

pip3 install flask-sqlalchemy -i https://pypi.douban.com/simple  # 使用豆瓣的镜像

3.flask-sqlalchemy 的使用

# app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 实例化 SQLAlchemy -> 一定要设置为全局变量,且在视图文件和models文件上面
db = SQLAlchemy()  # 创建 SQLAlchemy 所用到的所有东西的一个对象,唯独少了数据库连接

from models import * # 如果不导入 flask_sqlalchemy 就不会创建表,因为 models.py 没有被执行

app = Flask(__name__)
app.config.from_object('settings.ProConfig')  # 设置配置文件

# 从app配置文件中获取相关的 SQLAlchemy 配置
db.init_app(app) # 通过读取app的配置文件获取到数据库的连接


@app.route('/home')
def home():
# 添加数据
 # db.session.add(Users(name='Kevin', age=18, address='横沥'))
 # db.session.commit()
# db.session.remove()

# 查询数据
    result = db.session.query(Users.name, Users.age).all()
    print(result)
    db.session.remove()

    return '首页'


if __name__ == '__main__':
    app.run()

# flask-sqlalchemy 的所有配置项和默认值

app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'sqlite:///:memory:')  # 连接那个数据库
app.config.setdefault('SQLALCHEMY_BINDS', None)
app.config.setdefault('SQLALCHEMY_NATIVE_UNICODE', None)
app.config.setdefault('SQLALCHEMY_ECHO', False)
app.config.setdefault('SQLALCHEMY_RECORD_QUERIES', None)
app.config.setdefault('SQLALCHEMY_POOL_SIZE', None)  # 连接池中的连接数
app.config.setdefault('SQLALCHEMY_POOL_TIMEOUT', None)  # 连接池中没有线程后最多等待的时间(单位:秒),如果超过指定时间还没有连接就报错
app.config.setdefault('SQLALCHEMY_POOL_RECYCLE', None # 多久之后对线程池中的线程进行一次连接的回收(重置)(单位:秒)-> -1表示不重置
app.config.setdefault('SQLALCHEMY_MAX_OVERFLOW', None)  # 允许溢出多少个连接(即:连接池的连接已满后,还可以创建多少条连接)
app.config.setdefault('SQLALCHEMY_COMMIT_ON_TEARDOWN', False)

# settings.py

class BaseConfig(object):
 # SQLAlchemy 配置
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@127.0.0.1:3306/db1?charset=utf8'
    SQLALCHEMY_MAX_OVERFLOW = 10  # 允许溢出多少个连接(即:连接池的连接已满后,还可以创建多少条连接)
    SQLALCHEMY_POOL_SIZE = 5  # 连接池中的连接数
    SQLALCHEMY_POOL_TIMEOUT = 10  # 连接池中没有线程后最多等待的时间(单位:秒),如果超过指定时间还没有连接就报错
    SQLALCHEMY_POOL_RECYCLE = -1  # 多久之后对线程池中的线程进行一次连接的回收(重置)(单位:秒)-> -1表示不重置


class ProConfig(BaseConfig):
    pass

# models.py

from sqlalchemy import Column, Integer, VARCHAR
from app import db


# Users 表的类
class Users(db.Model):  # 创建表的类一定要继承 db.Model
    __tablename__ = 'users'  # 表名
    id = Column(Integer, primary_key=True, autoincrement=True)  # 整型 设置主键 设置自增列
    name = Column(VARCHAR(32), nullable=False, index=True)  # varchar类型(长度:32) 不允许为空 将name字段设置为索引
    age = Column(Integer)  # 整形
    address = Column(VARCHAR(32))  # varchar类型(长度:32)

  • 通过离线文件创建或删除表(即: 需要单独运行该py文件)

    • flask-sqlalchemy 不支持修改表,需要使用第三方模块(即: flask-migrate)

# create_table.py

from app import db, app

app_ctx = app.app_context()  # app_ctx = app/g

with app_ctx:  # 当 with 对象的时候,就会执行该对象所在的类中的 __enter__ 和 __exit__ 方法

# app_ctx 所在的类中的 __enter__ 方法的作用: 通过 LocalStack 放入 Local 中

# 创建表
    db.create_all()  # 相当于执行原 SQLAlchemy 的 create_all
# 会先去指定上下文中找到app,然后找到app的配置文件中的 flask-sqlalchemy 相关配置,最终生成数据库表

# 删除表
db.drop_all()

# app_ctx 所在的类中的 __enter__ 方法的作用: 移除移除Local中你所放入的 app_ctx 对象